/**
 * @Author:  renyc
 * @Date: 2023年2月9日10:08:17
 */
'use strict';

import SourceType from "../type/SourceType";
import Util from "../../utils/Util";
import EventFactory from "../../event/EventFactory";

/**
 * 定义Source的默认OPTS数据结构
 */
const SOURCE_OPTS = {
    id      : undefined,            //定义默认的id，每一个Source有一个唯一id。当Source从数据库中加载时，可以用数据库中的source id为该属性赋值
    type    : SourceType.NONE       //定义Source的默认类型，默认为无类型    
 }

/**
 * 数据源类
 * @description 
 * 1）用于定义Layer的数据源
 * 2）封装与数据源的交互、缓存获取数据、进行数据格式转换生成符合OneSIS规范的数据格式
 * 3）定义Source事件，实现异步的交互。
 * 4）Source对应一个数据集。例如，一个PG数据库中有多个表，Source必须指定一个明确的表。通过typeName属性定义表名。
 */
class DataSource{

    constructor(name, options){
        //Layer属性
        this._id = options.id || Util.uuid();
        this._name = name || this._id;
        this._type = options.type || SourceType.NONE;

        /**
         * @description 定义DataSource的Provider。Provider用于进行数据源数据的编码解码等处理。
         * @protected
         * @date 2023年3月6日11:22:32         
         */
        this._provider = undefined;

        //Source事件
        this._event = EventFactory.createSourceEvent();

    }

    get name(){
        return this._name;
    }

    /**
     * @description 获取DataSource的Provider
     */
    get provider(){
        return this._provider;
    }

    /**
     * Source获取数据
     * @override
     * @description
     *  fetch函数有Source的派生类实现。
     * @returns
     *  success:    触发FETCHED事件。调用者响应FETCHED事件获得数据。 
     *  failure:    触发FETCH_ERROR事件 
     * 
     */
    fetch(){}

    /**
     * @description 清空Source
     * @override
     */
    cleanup(){}

    /**
     * 注册Layer事件监听
     * @param {*} type 
     * @param {*} listener 
     */
    on(type, listener, context){
        let scope = context || this;
        return this._event.on(type, listener, scope);
    }

    /**
     * 注销Layer事件监听
     * @param {*} type 
     * @param {*} listener 
     */
    off(type, listener){
        return this._event.off(type, listener, this);
    }

    /**
     * 触发Layer事件
     * @private
     * @param {*} type 
     * @param {*} params 
     * @returns this
     */
    _fire(type, params) {
        this._event.fire(type, params)
        return this;
    }


}

export default DataSource;